package main

// 139. 单词拆分
func main() {
	wordDict := []string{"leet", "code"}
	s := "leetcode"
	b := wordBreak(s, wordDict)
	println(b)
}

func wordBreak(s string, wordDict []string) bool {
	if len(wordDict) == 0 {
		return false
	}

	sLen := len(s)
	preArray := make([]bool, sLen)

	maxWordLen := 0 // 限定查询
	wordMap := make(map[string]bool)
	for _, word := range wordDict {
		maxWordLen = maxInt1(maxWordLen, len(word))
		wordMap[word] = true
	}

	for i := 0; i < sLen; i++ {
		var ok bool
		for j := i; j >= 0 && i-j <= maxWordLen; j-- {
			str := s[j : i+1]
			if (j-1 < 0 || preArray[j-1]) && wordMap[str] {
				ok = true
				break
			}
		}
		preArray[i] = ok
	}

	return preArray[sLen-1]
}

func maxInt1(int1, int2 int) int {
	if int1 > int2 {
		return int1
	}
	return int2
}

// 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
//
//注意：不要求字典中出现的单词全部都使用，并且字典中的单词可以重复使用。
//
//
//
//示例 1：
//
//输入: s = "leetcode", wordDict = ["leet", "code"]
//输出: true
//解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
//示例 2：
//
//输入: s = "applepenapple", wordDict = ["apple", "pen"]
//输出: true
//解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
//     注意，你可以重复使用字典中的单词。
//示例 3：
//
//输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
//输出: false
//
//
//提示：
//
//1 <= s.length <= 300
//1 <= wordDict.length <= 1000
//1 <= wordDict[i].length <= 20
//s 和 wordDict[i] 仅由小写英文字母组成
//wordDict 中的所有字符串 互不相同
